開始三天假期了~~~~大雨嘩啦嘩啦,不知道還有沒有煙火看呢!?
好啦,回歸正題。
上一篇稍微介紹一下了執行緒,
這次小菜鳥想跟大家分享執行緒的同事,啊不,是同步。
理論上來說,Therad物件可以存取在Java程式中的任何一個物件,
執行緒同步的主要原因是為了避免在同一個時間,
有多個執行緒同時存取同一個物件而造成資料錯誤的混亂場面,
JVM提供了一種機制,再發生多個執行緒同時存取且修改同一個物件時,
利用關鍵字synchronized來解決混亂的情形。
當Therad物件離開synchronized程式區塊時,
代表著程式區塊已經被釋放,
JVM會處於中斷狀態下的眾多Therad物件中,
挑選一個Therad物件繼續執行。
假設我們有兩萬個,沒有看錯是兩萬個金塊!大富豪了...
有三個小偷要來偷金塊,讓他們肆無忌憚的來偷看看,
就是沒有同步時的狀況。
class GoldClass implements Runnable {
int grabed;
static int totalGold = 20000000;
Thread t;
GoldClass(String name) {
grabed = 0;
t = new Thread(this, name);
t.start();
}
public void run() {
while (grabGold() == true) {
grabed++;
}
System.out.println(t.getName() + " 總共偷得 " + grabed + " 個金塊.");
}
private static boolean grabGold() {
if (totalGold > 0) {
totalGold--;
return true;
} else {
return false;
}
}
}
class NonSynchronizedDemo {
public static void main(String[] args) {
System.out.println("共有 " + GoldClass.totalGold + " 個金塊!");
GoldClass tA = new GoldClass("威士忌");
GoldClass tB = new GoldClass("伏特加");
GoldClass tC = new GoldClass("龍舌蘭");
}
}
祝大家假期愉快~~~~晚安。